{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "suBex3vnr5GO"
   },
   "source": [
    "# Hello, Numerai"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "k7VRkpptr5GR"
   },
   "source": [
    "Hello and welcome to the Numerai Data Science Tournament!\n",
    "\n",
    "This notebook is designed to help you build your first machine learning model and start competing the tournament.\n",
    "\n",
    "In this notebook we will\n",
    "1. Download and explore the Numerai dataset\n",
    "2. Train and evaluate your first machine learning model\n",
    "3. Deploy your model to start making live submissions"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "gRGkuracAkoj",
    "outputId": "912511ae-5456-4faa-8fdb-1f731b077c3e",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:01.788606Z",
     "start_time": "2025-10-30T21:13:01.636466Z"
    }
   },
   "source": [
    "!python --version"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Python 3.11.11\r\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "THMEU_T4r5GS",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:03.557396Z",
     "start_time": "2025-10-30T21:13:01.789617Z"
    }
   },
   "source": [
    "# Install dependencies\n",
    "!pip install -q --upgrade numerapi pandas pyarrow matplotlib lightgbm scikit-learn scipy cloudpickle==3.1.1\n",
    "!pip install -q --no-deps numerai-tools\n",
    "\n",
    "# Inline plots\n",
    "%matplotlib inline"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\r\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m25.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.3\u001B[0m\r\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n",
      "\r\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m A new release of pip is available: \u001B[0m\u001B[31;49m25.2\u001B[0m\u001B[39;49m -> \u001B[0m\u001B[32;49m25.3\u001B[0m\r\n",
      "\u001B[1m[\u001B[0m\u001B[34;49mnotice\u001B[0m\u001B[1;39;49m]\u001B[0m\u001B[39;49m To update, run: \u001B[0m\u001B[32;49mpip install --upgrade pip\u001B[0m\r\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "YoeLNZTSr5GT"
   },
   "source": [
    "## 1. Dataset  \n",
    "\n",
    "At a high level, the Numerai dataset is a tabular dataset that describes the stock market over time. It is compiled from high-quality (and expensive) data that might be difficult for individuals to obtain.\n",
    "\n",
    "The unique thing about Numerai's dataset is that it is `obfuscated`, which means that the underlying stock ids, feature names, and target definitions are anonymized. This makes it so that we can give this data out for free and so that it can be modeled without any financial domain knowledge (or bias!)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4ECU5uszr5GU"
   },
   "source": [
    "### Listing the datasets\n",
    "Firstly, take a look at the files Numerai offers below:"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "4B4bbH07r5GU",
    "outputId": "5a959b9d-4edc-4660-df06-27e633ceb48d",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:03.945679Z",
     "start_time": "2025-10-30T21:13:03.558369Z"
    }
   },
   "source": [
    "# Initialize NumerAPI - the official Python API client for Numerai\n",
    "from numerapi import NumerAPI\n",
    "napi = NumerAPI()\n",
    "\n",
    "# list the datasets and available versions\n",
    "all_datasets = napi.list_datasets()\n",
    "dataset_versions = list(set(d.split('/')[0] for d in all_datasets))\n",
    "print(\"Available versions:\\n\", dataset_versions)\n",
    "\n",
    "# Set data version to one of the latest datasets\n",
    "DATA_VERSION = \"v5.1\"\n",
    "\n",
    "# Print all files available for download for our version\n",
    "current_version_files = [f for f in all_datasets if f.startswith(DATA_VERSION)]\n",
    "print(\"Available\", DATA_VERSION, \"files:\\n\", current_version_files)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Available versions:\n",
      " ['v5.0', 'v5.1']\n",
      "Available v5.1 files:\n",
      " ['v5.1/features.json', 'v5.1/live.parquet', 'v5.1/live_benchmark_models.parquet', 'v5.1/live_example_preds.csv', 'v5.1/live_example_preds.parquet', 'v5.1/meta_model.parquet', 'v5.1/train.parquet', 'v5.1/train_benchmark_models.parquet', 'v5.1/validation.parquet', 'v5.1/validation_benchmark_models.parquet', 'v5.1/validation_example_preds.csv', 'v5.1/validation_example_preds.parquet']\n"
     ]
    }
   ],
   "execution_count": 3
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "avIeXI5T9CC-"
   },
   "source": [
    "### Downloading datasets\n",
    "\n",
    "The `features.json` file contains metadata about features in the dataset including:\n",
    "- statistics on each feature\n",
    "- helpful sets of features\n",
    "- the targets available for training\n",
    "\n",
    "Let's download it and take a look:"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "_Mldufeo9BKS",
    "outputId": "0f97b4ed-ccb3-482c-cf49-b7226a49f526",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:04.465165Z",
     "start_time": "2025-10-30T21:13:03.946744Z"
    }
   },
   "source": [
    "import json\n",
    "\n",
    "# download the feature metadata file\n",
    "napi.download_dataset(f\"{DATA_VERSION}/features.json\")\n",
    "\n",
    "# read the metadata and display\n",
    "feature_metadata = json.load(open(f\"{DATA_VERSION}/features.json\"))\n",
    "for metadata in feature_metadata:\n",
    "  print(metadata, len(feature_metadata[metadata]))"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-10-30 14:13:04,458 INFO numerapi.utils: target file already exists\n",
      "2025-10-30 14:13:04,459 INFO numerapi.utils: download complete\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "feature_sets 18\n",
      "targets 37\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "sESS7Wfs_pqz"
   },
   "source": [
    "### Feature Sets & Groups\n",
    "As you can see there are many features and targets to choose from.\n",
    "\n",
    "Instead of training a model on all 2000+ features, let's pick a subset of features to analyze.\n",
    "\n",
    "Here are a few starter sets Numerai offers:\n",
    "\n",
    "- `small` contains a minimal subset of features that have the highest [feature importance](https://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html)\n",
    "\n",
    "- `medium` contains all the \"basic\" features, each unique in some way (e.g. P/E ratios vs analyst ratings)\n",
    "\n",
    "- `all` contains all features in `medium` and their variants (e.g. P/E by country vs P/E by sector)\n",
    "\n",
    "Let's take a look at the medium feature set:"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "TeAzyU9q_dwR",
    "outputId": "ddb255d1-29f4-4d45-9b82-4477613a8089",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:04.468769Z",
     "start_time": "2025-10-30T21:13:04.466206Z"
    }
   },
   "source": [
    "feature_sets = feature_metadata[\"feature_sets\"]\n",
    "for feature_set in [\"small\", \"medium\", \"all\"]:\n",
    "  print(feature_set, len(feature_sets[feature_set]))"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "small 42\n",
      "medium 740\n",
      "all 2562\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "h0-iMpdJAubs"
   },
   "source": [
    "\n",
    "The `medium` set seems much more reasonable.\n",
    "\n",
    "Using it will speed up model training and reduce memory usage (required for Colab free tier).\n",
    "\n",
    "Let's load the training data for just the medium feature set:"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "UC5YkX1xr5GV",
    "outputId": "04c9de0c-778d-4f1c-edff-c58d040685eb",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:06.047620Z",
     "start_time": "2025-10-30T21:13:04.469578Z"
    }
   },
   "source": [
    "import pandas as pd\n",
    "\n",
    "# Define our feature set\n",
    "feature_set = feature_sets[\"small\"]\n",
    "# use \"medium\" or \"all\" for better performance. Requires more RAM.\n",
    "# features = feature_metadata[\"feature_sets\"][\"medium\"]\n",
    "# features = feature_metadata[\"feature_sets\"][\"all\"]\n",
    "\n",
    "# Download the training data - this will take a few minutes\n",
    "napi.download_dataset(f\"{DATA_VERSION}/train.parquet\")\n",
    "\n",
    "# Load only the \"medium\" feature set to\n",
    "# Use the \"all\" feature set to use all features\n",
    "train = pd.read_parquet(\n",
    "    f\"{DATA_VERSION}/train.parquet\",\n",
    "    columns=[\"era\", \"target\"] + feature_set\n",
    ")\n",
    "\n",
    "# Downsample to every 4th era to reduce memory usage and speedup model training (suggested for Colab free tier)\n",
    "# Comment out the line below to use all the data\n",
    "train = train[train[\"era\"].isin(train[\"era\"].unique()[::4])]"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-10-30 14:13:04,937 INFO numerapi.utils: target file already exists\n",
      "2025-10-30 14:13:04,938 INFO numerapi.utils: download complete\n"
     ]
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "jBcMKMX6FoNl"
   },
   "source": [
    "\n",
    "### Training data\n",
    "\n",
    "Each row represents a stock at a specific point in time:\n",
    "- `id` is the stock id\n",
    "- `era` is the date\n",
    "- `target` is a measure of future returns for that stock\n",
    "- `features` describe the attributes of the stock (eg. P/E ratio) for that date"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 475
    },
    "id": "o9JOOMqpFscM",
    "outputId": "e7dd7980-053d-4f42-a861-7e871379492c",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:06.117675Z",
     "start_time": "2025-10-30T21:13:06.048265Z"
    }
   },
   "source": [
    "train"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                   era  target  feature_antistrophic_striate_conscriptionist  \\\n",
       "id                                                                             \n",
       "n0007b5abb0c3a25  0001    0.25                                             2   \n",
       "n003bba8a98662e4  0001    0.25                                             2   \n",
       "n003bee128c2fcfc  0001    0.75                                             2   \n",
       "n0048ac83aff7194  0001    0.25                                             2   \n",
       "n0055a2401ba6480  0001    0.25                                             2   \n",
       "...                ...     ...                                           ...   \n",
       "nffc2d5e4b79a7ae  0573    0.00                                             1   \n",
       "nffc9844c1c7a6a9  0573    0.25                                             2   \n",
       "nffd79773f4109bb  0573    0.50                                             3   \n",
       "nfff6ab9d6dc0b32  0573    0.25                                             2   \n",
       "nfff87b21e4db902  0573    0.50                                             3   \n",
       "\n",
       "                  feature_bicameral_showery_wallaba  \\\n",
       "id                                                    \n",
       "n0007b5abb0c3a25                                  2   \n",
       "n003bba8a98662e4                                  2   \n",
       "n003bee128c2fcfc                                  2   \n",
       "n0048ac83aff7194                                  2   \n",
       "n0055a2401ba6480                                  2   \n",
       "...                                             ...   \n",
       "nffc2d5e4b79a7ae                                  2   \n",
       "nffc9844c1c7a6a9                                  1   \n",
       "nffd79773f4109bb                                  4   \n",
       "nfff6ab9d6dc0b32                                  0   \n",
       "nfff87b21e4db902                                  0   \n",
       "\n",
       "                  feature_bridal_fingered_pensioner  \\\n",
       "id                                                    \n",
       "n0007b5abb0c3a25                                  2   \n",
       "n003bba8a98662e4                                  2   \n",
       "n003bee128c2fcfc                                  2   \n",
       "n0048ac83aff7194                                  2   \n",
       "n0055a2401ba6480                                  2   \n",
       "...                                             ...   \n",
       "nffc2d5e4b79a7ae                                  1   \n",
       "nffc9844c1c7a6a9                                  2   \n",
       "nffd79773f4109bb                                  0   \n",
       "nfff6ab9d6dc0b32                                  3   \n",
       "nfff87b21e4db902                                  4   \n",
       "\n",
       "                  feature_collectivist_flaxen_gueux  \\\n",
       "id                                                    \n",
       "n0007b5abb0c3a25                                  2   \n",
       "n003bba8a98662e4                                  2   \n",
       "n003bee128c2fcfc                                  2   \n",
       "n0048ac83aff7194                                  2   \n",
       "n0055a2401ba6480                                  2   \n",
       "...                                             ...   \n",
       "nffc2d5e4b79a7ae                                  0   \n",
       "nffc9844c1c7a6a9                                  1   \n",
       "nffd79773f4109bb                                  3   \n",
       "nfff6ab9d6dc0b32                                  1   \n",
       "nfff87b21e4db902                                  3   \n",
       "\n",
       "                  feature_concurring_fabled_adapter  \\\n",
       "id                                                    \n",
       "n0007b5abb0c3a25                                  2   \n",
       "n003bba8a98662e4                                  2   \n",
       "n003bee128c2fcfc                                  2   \n",
       "n0048ac83aff7194                                  2   \n",
       "n0055a2401ba6480                                  2   \n",
       "...                                             ...   \n",
       "nffc2d5e4b79a7ae                                  3   \n",
       "nffc9844c1c7a6a9                                  4   \n",
       "nffd79773f4109bb                                  4   \n",
       "nfff6ab9d6dc0b32                                  2   \n",
       "nfff87b21e4db902                                  0   \n",
       "\n",
       "                  feature_crosscut_whilom_ataxy  \\\n",
       "id                                                \n",
       "n0007b5abb0c3a25                              0   \n",
       "n003bba8a98662e4                              1   \n",
       "n003bee128c2fcfc                              2   \n",
       "n0048ac83aff7194                              1   \n",
       "n0055a2401ba6480                              0   \n",
       "...                                         ...   \n",
       "nffc2d5e4b79a7ae                              2   \n",
       "nffc9844c1c7a6a9                              2   \n",
       "nffd79773f4109bb                              1   \n",
       "nfff6ab9d6dc0b32                              2   \n",
       "nfff87b21e4db902                              2   \n",
       "\n",
       "                  feature_departmental_inimitable_sentencer  \\\n",
       "id                                                            \n",
       "n0007b5abb0c3a25                                          1   \n",
       "n003bba8a98662e4                                          4   \n",
       "n003bee128c2fcfc                                          2   \n",
       "n0048ac83aff7194                                          4   \n",
       "n0055a2401ba6480                                          0   \n",
       "...                                                     ...   \n",
       "nffc2d5e4b79a7ae                                          1   \n",
       "nffc9844c1c7a6a9                                          2   \n",
       "nffd79773f4109bb                                          0   \n",
       "nfff6ab9d6dc0b32                                          1   \n",
       "nfff87b21e4db902                                          2   \n",
       "\n",
       "                  feature_dialectal_homely_cambodia  ...  \\\n",
       "id                                                   ...   \n",
       "n0007b5abb0c3a25                                  2  ...   \n",
       "n003bba8a98662e4                                  2  ...   \n",
       "n003bee128c2fcfc                                  2  ...   \n",
       "n0048ac83aff7194                                  2  ...   \n",
       "n0055a2401ba6480                                  2  ...   \n",
       "...                                             ...  ...   \n",
       "nffc2d5e4b79a7ae                                  1  ...   \n",
       "nffc9844c1c7a6a9                                  4  ...   \n",
       "nffd79773f4109bb                                  1  ...   \n",
       "nfff6ab9d6dc0b32                                  2  ...   \n",
       "nfff87b21e4db902                                  3  ...   \n",
       "\n",
       "                  feature_tridactyl_immoral_snorting  \\\n",
       "id                                                     \n",
       "n0007b5abb0c3a25                                   4   \n",
       "n003bba8a98662e4                                   4   \n",
       "n003bee128c2fcfc                                   3   \n",
       "n0048ac83aff7194                                   1   \n",
       "n0055a2401ba6480                                   1   \n",
       "...                                              ...   \n",
       "nffc2d5e4b79a7ae                                   2   \n",
       "nffc9844c1c7a6a9                                   4   \n",
       "nffd79773f4109bb                                   3   \n",
       "nfff6ab9d6dc0b32                                   4   \n",
       "nfff87b21e4db902                                   4   \n",
       "\n",
       "                  feature_trimeter_soggy_greatest  \\\n",
       "id                                                  \n",
       "n0007b5abb0c3a25                                1   \n",
       "n003bba8a98662e4                                2   \n",
       "n003bee128c2fcfc                                1   \n",
       "n0048ac83aff7194                                3   \n",
       "n0055a2401ba6480                                0   \n",
       "...                                           ...   \n",
       "nffc2d5e4b79a7ae                                2   \n",
       "nffc9844c1c7a6a9                                0   \n",
       "nffd79773f4109bb                                0   \n",
       "nfff6ab9d6dc0b32                                1   \n",
       "nfff87b21e4db902                                0   \n",
       "\n",
       "                  feature_unanalyzable_excusable_whirlwind  \\\n",
       "id                                                           \n",
       "n0007b5abb0c3a25                                         1   \n",
       "n003bba8a98662e4                                         0   \n",
       "n003bee128c2fcfc                                         1   \n",
       "n0048ac83aff7194                                         4   \n",
       "n0055a2401ba6480                                         1   \n",
       "...                                                    ...   \n",
       "nffc2d5e4b79a7ae                                         1   \n",
       "nffc9844c1c7a6a9                                         0   \n",
       "nffd79773f4109bb                                         0   \n",
       "nfff6ab9d6dc0b32                                         1   \n",
       "nfff87b21e4db902                                         0   \n",
       "\n",
       "                  feature_unbreakable_constraining_hegelianism  \\\n",
       "id                                                               \n",
       "n0007b5abb0c3a25                                             3   \n",
       "n003bba8a98662e4                                             0   \n",
       "n003bee128c2fcfc                                             0   \n",
       "n0048ac83aff7194                                             1   \n",
       "n0055a2401ba6480                                             0   \n",
       "...                                                        ...   \n",
       "nffc2d5e4b79a7ae                                             2   \n",
       "nffc9844c1c7a6a9                                             3   \n",
       "nffd79773f4109bb                                             0   \n",
       "nfff6ab9d6dc0b32                                             1   \n",
       "nfff87b21e4db902                                             0   \n",
       "\n",
       "                  feature_unformed_bent_smatch  \\\n",
       "id                                               \n",
       "n0007b5abb0c3a25                             0   \n",
       "n003bba8a98662e4                             0   \n",
       "n003bee128c2fcfc                             1   \n",
       "n0048ac83aff7194                             2   \n",
       "n0055a2401ba6480                             0   \n",
       "...                                        ...   \n",
       "nffc2d5e4b79a7ae                             3   \n",
       "nffc9844c1c7a6a9                             1   \n",
       "nffd79773f4109bb                             1   \n",
       "nfff6ab9d6dc0b32                             2   \n",
       "nfff87b21e4db902                             0   \n",
       "\n",
       "                  feature_unministerial_unextenuated_teleostean  \\\n",
       "id                                                                \n",
       "n0007b5abb0c3a25                                              2   \n",
       "n003bba8a98662e4                                              2   \n",
       "n003bee128c2fcfc                                              2   \n",
       "n0048ac83aff7194                                              2   \n",
       "n0055a2401ba6480                                              2   \n",
       "...                                                         ...   \n",
       "nffc2d5e4b79a7ae                                              3   \n",
       "nffc9844c1c7a6a9                                              3   \n",
       "nffd79773f4109bb                                              1   \n",
       "nfff6ab9d6dc0b32                                              2   \n",
       "nfff87b21e4db902                                              1   \n",
       "\n",
       "                  feature_unmodish_zymogenic_rousing  \\\n",
       "id                                                     \n",
       "n0007b5abb0c3a25                                   2   \n",
       "n003bba8a98662e4                                   2   \n",
       "n003bee128c2fcfc                                   2   \n",
       "n0048ac83aff7194                                   2   \n",
       "n0055a2401ba6480                                   2   \n",
       "...                                              ...   \n",
       "nffc2d5e4b79a7ae                                   3   \n",
       "nffc9844c1c7a6a9                                   3   \n",
       "nffd79773f4109bb                                   4   \n",
       "nfff6ab9d6dc0b32                                   1   \n",
       "nfff87b21e4db902                                   0   \n",
       "\n",
       "                  feature_unsystematized_subcardinal_malaysia  \\\n",
       "id                                                              \n",
       "n0007b5abb0c3a25                                            3   \n",
       "n003bba8a98662e4                                            4   \n",
       "n003bee128c2fcfc                                            0   \n",
       "n0048ac83aff7194                                            2   \n",
       "n0055a2401ba6480                                            1   \n",
       "...                                                       ...   \n",
       "nffc2d5e4b79a7ae                                            2   \n",
       "nffc9844c1c7a6a9                                            2   \n",
       "nffd79773f4109bb                                            0   \n",
       "nfff6ab9d6dc0b32                                            0   \n",
       "nfff87b21e4db902                                            0   \n",
       "\n",
       "                  feature_willful_sere_chronobiology  \\\n",
       "id                                                     \n",
       "n0007b5abb0c3a25                                   3   \n",
       "n003bba8a98662e4                                   4   \n",
       "n003bee128c2fcfc                                   3   \n",
       "n0048ac83aff7194                                   0   \n",
       "n0055a2401ba6480                                   4   \n",
       "...                                              ...   \n",
       "nffc2d5e4b79a7ae                                   2   \n",
       "nffc9844c1c7a6a9                                   3   \n",
       "nffd79773f4109bb                                   1   \n",
       "nfff6ab9d6dc0b32                                   0   \n",
       "nfff87b21e4db902                                   4   \n",
       "\n",
       "                  feature_zoological_peristomial_scute  \n",
       "id                                                      \n",
       "n0007b5abb0c3a25                                     2  \n",
       "n003bba8a98662e4                                     2  \n",
       "n003bee128c2fcfc                                     2  \n",
       "n0048ac83aff7194                                     2  \n",
       "n0055a2401ba6480                                     2  \n",
       "...                                                ...  \n",
       "nffc2d5e4b79a7ae                                     1  \n",
       "nffc9844c1c7a6a9                                     2  \n",
       "nffd79773f4109bb                                     2  \n",
       "nfff6ab9d6dc0b32                                     2  \n",
       "nfff87b21e4db902                                     3  \n",
       "\n",
       "[688184 rows x 44 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>era</th>\n",
       "      <th>target</th>\n",
       "      <th>feature_antistrophic_striate_conscriptionist</th>\n",
       "      <th>feature_bicameral_showery_wallaba</th>\n",
       "      <th>feature_bridal_fingered_pensioner</th>\n",
       "      <th>feature_collectivist_flaxen_gueux</th>\n",
       "      <th>feature_concurring_fabled_adapter</th>\n",
       "      <th>feature_crosscut_whilom_ataxy</th>\n",
       "      <th>feature_departmental_inimitable_sentencer</th>\n",
       "      <th>feature_dialectal_homely_cambodia</th>\n",
       "      <th>...</th>\n",
       "      <th>feature_tridactyl_immoral_snorting</th>\n",
       "      <th>feature_trimeter_soggy_greatest</th>\n",
       "      <th>feature_unanalyzable_excusable_whirlwind</th>\n",
       "      <th>feature_unbreakable_constraining_hegelianism</th>\n",
       "      <th>feature_unformed_bent_smatch</th>\n",
       "      <th>feature_unministerial_unextenuated_teleostean</th>\n",
       "      <th>feature_unmodish_zymogenic_rousing</th>\n",
       "      <th>feature_unsystematized_subcardinal_malaysia</th>\n",
       "      <th>feature_willful_sere_chronobiology</th>\n",
       "      <th>feature_zoological_peristomial_scute</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>n0007b5abb0c3a25</th>\n",
       "      <td>0001</td>\n",
       "      <td>0.25</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n003bba8a98662e4</th>\n",
       "      <td>0001</td>\n",
       "      <td>0.25</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n003bee128c2fcfc</th>\n",
       "      <td>0001</td>\n",
       "      <td>0.75</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n0048ac83aff7194</th>\n",
       "      <td>0001</td>\n",
       "      <td>0.25</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n0055a2401ba6480</th>\n",
       "      <td>0001</td>\n",
       "      <td>0.25</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffc2d5e4b79a7ae</th>\n",
       "      <td>0573</td>\n",
       "      <td>0.00</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffc9844c1c7a6a9</th>\n",
       "      <td>0573</td>\n",
       "      <td>0.25</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffd79773f4109bb</th>\n",
       "      <td>0573</td>\n",
       "      <td>0.50</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfff6ab9d6dc0b32</th>\n",
       "      <td>0573</td>\n",
       "      <td>0.25</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfff87b21e4db902</th>\n",
       "      <td>0573</td>\n",
       "      <td>0.50</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>688184 rows × 44 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lSvdym9wr5GW"
   },
   "source": [
    "### Eras\n",
    "As mentioned above, each `era` corresponds to a different date. Each era is exactly 1 week apart.\n",
    "\n",
    "It is helpful to think about rows of stocks within the same `era` as a single example. You will notice that throughout this notebook and other examples, we often talk about things \"per era\". For example, the number of rows per era represents the number of stocks in Numerai's investable universe on that date."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 351
    },
    "id": "7JX0Bs95r5GX",
    "outputId": "475e99c8-577d-401f-c0cf-bd4c46b80016",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:06.199103Z",
     "start_time": "2025-10-30T21:13:06.118521Z"
    }
   },
   "source": [
    "# Plot the number of rows per era\n",
    "train.groupby(\"era\").size().plot(\n",
    "    title=\"Number of rows per era\",\n",
    "    figsize=(5, 3),\n",
    "    xlabel=\"Era\"\n",
    ")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Number of rows per era'}, xlabel='Era'>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ],
      "image/png": "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zJihPm+Jxx9/XN58802HHcfnn38ul156qQwYMEBmzZplcRwoBHTLLbfI119/bZcxaCQmJkqfPn0qLf/nn39k4sSJ6lxcc801cvDgQYcbw65du+S6666T/v37y5gxY2TFihUWvyMuLk66d+8uycnJdhlDTeNYv369XHXVVeo84Hnt2rVm265cuVLGjh2rxjlt2jTZvn27XX4XtbmeCgsL5aKLLqp0PL///nsZPXq0up7mzJkjubm5Dnc9VTcG7BuO7cUXXyyDBw+We++91+IYSktL1T1sy5YtdhnDs88+K127djV7LFu2zLj+p59+Ur8V3LtwrFNSUuwyBhxQl2T+/Pm6K6+8Urd3717dL7/8ouvfv7/uxx9/1JWXl6vl999/vy4+Pl733nvv6fr27atLSUlR2+G5X79+uiVLlugOHz6su+eee3QTJkxQ25myePFiXZcuXXQLFy50yHGsW7dOffaPP/7QJSQk6ObOnas+b8q5c+fU92McK1eutPkYNFJTU3VjxoxR+2HKiRMndH369NG9+eabumPHjukef/xx3ciRI3UlJSUOM4bMzEzdoEGDdK+++qrax++//17Xu3dv3Z9//mm2fWlpqbqOsJ9JSUlm62w1hurGcfz4cXWsP/zwQ3XcP/jgA13Pnj2N+7p27Vq1ftWqVeqzr7/+um7AgAG69PR0m/8uarqewBNPPFHpeMbFxakxfPPNN7oDBw7obrrpJt1tt91mtp29r6eaxvD555/rLr74Yt2WLVt0hw4d0l1//fW622+/3Wy74uJi3Zw5c9S2mzdvtssYZs6cqVu0aJH6fWiPoqIitW779u26Hj16qLEcPXpUN3v2bN0111xjlzG4pAA8ffq0ugmZHri3335bXfAbN25UAg6f0bj55puNP9g33nhDfU4DJw0nVvuuwsJC3V133aUbPHiw7pJLLmnUH3pDxrFgwQK1nxoHDx5UF1NOTo56jxsXvic2NlbdwBvrx17dGMCvv/6qGzZsmPohVRSAzz//fKVzcemll6qbl6OM4bPPPtONHTu20o3rvvvuM1v2zjvv6K677rpKAtBWY6hpHFj27LPPmn0e1/iaNWvU63vvvVf35JNPmq2//PLLdcuXL7fp76Km6wls3bpVd9lll+mGDx9udjwffPBB3UMPPWQ28eratasS+I5yPdU0Bgi7F1980fj+999/V/cB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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 8
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "FxQCUEEPr5GZ"
   },
   "source": [
    "### Target\n",
    "The `target` is a measure of stock market returns over the next 20 (business) days. Specifically, it is a measure of \"stock-specific\" returns that are not explained by well-known \"factors\" or broader trends in the market, country, or sector. For example, if Apple went up and the tech sector also went up, we only want to know if Apple went up more or less than the tech sector.\n",
    "\n",
    "Target values are binned into 5 unequal bins: `0`, `0.25`, `0.5`, `0.75`, `1.0`. Again, this heavy regularization of target values is to avoid overfitting as the underlying values are extremely noisy."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 351
    },
    "id": "8ALp0YQ6r5GZ",
    "outputId": "0afccf3e-13a6-4d30-bc7d-a3e14cdb6253",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:06.322886Z",
     "start_time": "2025-10-30T21:13:06.199766Z"
    }
   },
   "source": [
    "# Plot density histogram of the target\n",
    "train[\"target\"].plot(\n",
    "  kind=\"hist\",\n",
    "  title=\"Target\",\n",
    "  figsize=(5, 3),\n",
    "  xlabel=\"Value\",\n",
    "  density=True,\n",
    "  bins=50\n",
    ")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Target'}, xlabel='Value', ylabel='Frequency'>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 500x300 with 1 Axes>"
      ],
      "image/png": "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bT94OtTNAADLSjXBcZZBNQAAkBABAHChQgQAgIQIAIALFSIAACREAABcqBABACAhAgDgQoUIAAAJEQAAFypEAABIiAAAuFAhAgBAQgQAIAwqxAsXLsiLL74ojRo1kubNm8vMmTND3SQAgEWZeoHgN998U37++Wf54IMP5ODBg5KQkCDly5eXdu3ahbppAACLMW1CzMjIkI8//limTZsmtWvX1rc9e/bI3LlzSYgAAPt0me7atUuysrIkPj7es61hw4aydetWcTqdIW0bAMB6TFshHj16VGJjY6Vw4cKebTfccIM+r3jy5EkpVapUvvYTGSliGL61ISLC9bV2+RgpVtiR67HKN5TQXx2OvD9TqJ/pfr23j4fDY+5tUVGRecb3aq9zx8vfMQ33uATqMTPF22yx8eWxQMTTCnEJdEzV69Sx3BfXau8VzzUMX9NFYC1ZskTGjRsnX331lWfb/v37pXXr1rJ27VopV65cSNsHALAW03aZFilSRC5evJhrm/t+0aJFQ9QqAIBVmTYhli1bVk6cOKHPI+bsRlXJMCYmJqRtAwBYj2kT4i233CJRUVGyZcsWz7bNmzdL3bp1JdLXzmQAAK7CtJmlWLFi0rVrVxk5cqRs27ZNVq5cqSfm/+1vfwt10wAAFmTaQTXK+fPndUL88ssvJTo6Wp544gl57LHHQt0sAIAFmTohAgAgdu8yBQAgmEiIAACQEAEAcLF9hejNElM7duyQBx98UOrXry/333+/XonDyryJzZo1a6RLly762rOdO3eWVatWiVX5sizZgQMHdGw2btwoVuZNbHbv3i0PP/yw1KtXT79nUlJSxKq8icuKFSukffv2+v2i4rN9+3axg4sXL0qnTp2u+T8S8GOwYXOvvPKK0blzZ+Pnn382vvzySyM+Pt5Yvnz5Fc87d+6c0axZM+ONN94wUlNTjcTEROOOO+7Q2+0em507dxq1a9c2PvjgA+PXX381kpOT9X213c5xyemJJ54wqlevbqSkpBhWlt/YnD59Wv//DBs2TL9nxo0bZzRs2NA4duyYYee4/PLLL0bdunWNxYsXG7/99pvx8ssv6+NORkaGYWWZmZnGgAEDrvk/EoxjsK0TogqkevPl/ANMnDjReOSRR6547scff2y0atXKcDqd+r762qZNG2PhwoWG3WMzZswYfcDP6fHHHzeSkpIMO8fFbenS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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "rhj9RZGNr5GX"
   },
   "source": [
    "### Features\n",
    "The `features` are quantitative attributes of each stock: fundamentals like P/E ratio, technical signals like RSI, market data like short interest, secondary data like analyst ratings, and much more.\n",
    "\n",
    "The underlying definition of each feature is not important, just know that Numerai has included these features in the dataset because we believe they are predictive of the `target` either by themselves or in combination with other features.\n",
    "\n",
    "Feature values are binned into 5 equal bins: `0`, `1`, `2`, `3`, `4`. This heavy regularization of feature values is to avoid overfitting as the underlying values are extremely noisy. Unlike the target, these are integers instead of floats to reduce the storage needs of the overall dataset.\n",
    "\n",
    "If data for a particular feature is missing for that era (more common in early `eras`), then all values will be set to `2`."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 332
    },
    "id": "CHlSJccVr5GY",
    "outputId": "e59bb818-a976-47af-bc71-5bdbd0fa4ea1",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:06.496435Z",
     "start_time": "2025-10-30T21:13:06.323589Z"
    }
   },
   "source": [
    "import matplotlib.pyplot as plt\n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 3))\n",
    "first_era = train[train[\"era\"] == train[\"era\"].unique()[0]]\n",
    "last_era = train[train[\"era\"] == train[\"era\"].unique()[-1]]\n",
    "last_era[feature_set[-1]].plot(\n",
    "   title=\"5 equal bins\",\n",
    "   kind=\"hist\",\n",
    "   density=True,\n",
    "   bins=50,\n",
    "   ax=ax1\n",
    ")\n",
    "first_era[feature_set[-1]].plot(\n",
    "   title=\"missing data\",\n",
    "   kind=\"hist\",\n",
    "   density=True,\n",
    "   bins=50,\n",
    "   ax=ax2\n",
    ")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'missing data'}, ylabel='Frequency'>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x300 with 2 Axes>"
      ],
      "image/png": "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FQDAlzFLK1assIsuushmz56dte2FF16wTp062fLly2PqT64pyD/99NM8n3PrrbdanTp1wm6LFi2KpfgAgAAoqFi1ZcsWu+mmm6xp06Z2/vnn25QpU7J+t3XrVrvhhhvcEhp6348++qjA9wMAkGDJ0ujRo+2WW26xfv36ZW2bMWOG9ezZ0x555JGo3uvQoUN2991324YNG/J93qZNm2zs2LEuEIVu6gIIAEBhxaqMjAy3RIYmMJo1a5YNHz7cJk2a5BIwLc5+2223WaVKley1116zSy+91Pr27Wvbtm3jAwGAIHfD02x3WpA2J621NHHixIjfZ+PGjXbPPfe4gPNbLU/fffedNWzYMKubHwAAhR2rduzYYWeddZYNGzbMrSl4+umnW+vWrV3LlJIktSwpAStdurTVqFHDlixZ4hKn22+/nQ8HAILasnTmmWe6qcJz0lpLp512WsTvs2zZMmvVqpW9/PLL+T5v8+bNlpKSYtWqVYuluACAACqIWFWlShV7/PHHXaKkij0lSZ999pm1bNnSVq1a5RZiV6IU0rx5c1u5cmWB7gcAIMFalu68807r06ePWx29fv36btv69evt888/t6eeeiri99EitpFQsqRA1b9/f5dgnXjiia7WToviRislJeqXRPy6WN87yDhmBXecOJacf4VN51gs55lf52ZBxaoQrSOoLnYXXHCBWzJDXfmUTGWXnp5uP/zwQ1Tvm6j/u6FyJ2r54xX0/Zegx6agnwMpCb7/kZY7pmTp97//veu7ra4GSmTS0tKsbt26ri93YbT+6G8cPHjQ2rRp4/qOz5s3z034oBYpdc2LRnr68VYYKlQoUyjvm8w4ZhxLzr/EUr58Yl3nCjpWPfnkk65bnrrkjRo1yg4cOGDFixcPe44eq+v4sRCXikqilz9eQd///AQlzgf9HEhP8v2PKVmSWrVq2cCBA60oqGawR48edsIJJ7jHCnZfffWVzZw5M+pkaefOX+w3hkh5SktLzfeLwq5d++zo0Yzo3ziJFSuWmu+FkmMWOc4/zr9j4X929+59duRIRky1d34F04KMVaF4o4mJ7r33XuvWrZtLmLJTolSyZMkiiUt+C32uiVr+eAV9/yXosSno50BKgu9/pLEppmRJ6ys9//zz9uWXX9qRI0dyTdCgqVkLUmpqalailL0vuiaIiJaKGssHGslrEvFE8RvH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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 10
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Eyn-0Or3r5GZ"
   },
   "source": [
    "## 2. Modeling\n",
    "At a high level, our task is to model and predict the `target` using the `features`.\n",
    "\n",
    "### Model training\n",
    "\n",
    "You are free to use any tool or framework, but here we will be using LGBMRegressor, a popular choice amongst tournament participants. While you wait for the model to train, watch this [video](https://www.youtube.com/watch?v=w8Y7hY05z7k) to learn why tree-based models work so well on tabular datasets from our Chief Scientist MDO."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 198
    },
    "id": "prHdeg5Nr5GZ",
    "outputId": "02a58e7b-b32e-424c-818f-100bbc5b95f5",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:27.543494Z",
     "start_time": "2025-10-30T21:13:06.497325Z"
    }
   },
   "source": [
    "# https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMRegressor.html\n",
    "import lightgbm as lgb\n",
    "\n",
    "# https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html\n",
    "model = lgb.LGBMRegressor(\n",
    "  n_estimators=2000,\n",
    "  learning_rate=0.01,\n",
    "  max_depth=5,\n",
    "  num_leaves=2**5-1,\n",
    "  colsample_bytree=0.1\n",
    ")\n",
    "# We've found the following \"deep\" parameters perform much better, but they require much more CPU and RAM\n",
    "# model = lgb.LGBMRegressor(\n",
    "#     n_estimators=30_000,\n",
    "#     learning_rate=0.001,\n",
    "#     max_depth=10,\n",
    "#     num_leaves=2**10,\n",
    "#     colsample_bytree=0.1\n",
    "#     min_data_in_leaf=10000,\n",
    "# )\n",
    "\n",
    "# This will take a few minutes 🍵\n",
    "model.fit(\n",
    "  train[feature_set],\n",
    "  train[\"target\"]\n",
    ")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Auto-choosing row-wise multi-threading, the overhead of testing was 0.001331 seconds.\n",
      "You can set `force_row_wise=true` to remove the overhead.\n",
      "And if memory is not enough, you can set `force_col_wise=true`.\n",
      "[LightGBM] [Info] Total Bins 210\n",
      "[LightGBM] [Info] Number of data points in the train set: 688184, number of used features: 42\n",
      "[LightGBM] [Info] Start training from score 0.500008\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "LGBMRegressor(colsample_bytree=0.1, learning_rate=0.01, max_depth=5,\n",
       "              n_estimators=2000)"
      ],
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: start;\n",
       "  justify-content: space-between;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    font-family: monospace;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td.value pre {\n",
       "    color:rgb(255, 94, 0) !important;\n",
       "    background-color: transparent !important;\n",
       "}\n",
       "\n",
       ".default td {\n",
       "    color: black;\n",
       "    text-align: left;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url();\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LGBMRegressor(colsample_bytree=0.1, learning_rate=0.01, max_depth=5,\n",
       "              n_estimators=2000)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LGBMRegressor</div></div><div><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('boosting_type',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">boosting_type&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;gbdt&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('num_leaves',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">num_leaves&nbsp;</td>\n",
       "            <td class=\"value\">31</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('max_depth',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">max_depth&nbsp;</td>\n",
       "            <td class=\"value\">5</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('learning_rate',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">learning_rate&nbsp;</td>\n",
       "            <td class=\"value\">0.01</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_estimators',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_estimators&nbsp;</td>\n",
       "            <td class=\"value\">2000</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('subsample_for_bin',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">subsample_for_bin&nbsp;</td>\n",
       "            <td class=\"value\">200000</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('objective',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">objective&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">class_weight&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_split_gain',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">min_split_gain&nbsp;</td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_child_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">min_child_weight&nbsp;</td>\n",
       "            <td class=\"value\">0.001</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('min_child_samples',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">min_child_samples&nbsp;</td>\n",
       "            <td class=\"value\">20</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('subsample',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">subsample&nbsp;</td>\n",
       "            <td class=\"value\">1.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('subsample_freq',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">subsample_freq&nbsp;</td>\n",
       "            <td class=\"value\">0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"user-set\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('colsample_bytree',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">colsample_bytree&nbsp;</td>\n",
       "            <td class=\"value\">0.1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('reg_alpha',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">reg_alpha&nbsp;</td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('reg_lambda',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">reg_lambda&nbsp;</td>\n",
       "            <td class=\"value\">0.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">random_state&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_jobs',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">n_jobs&nbsp;</td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('importance_type',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">importance_type&nbsp;</td>\n",
       "            <td class=\"value\">&#x27;split&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "</script></body>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 11
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "jTqgml-br5Ga"
   },
   "source": [
    "### Validation predictions\n",
    "\n",
    "Now let's make some out-of-sample predictions on the validation dataset to evaluate our model's performance."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 473
    },
    "id": "ImonnvQYr5Ga",
    "outputId": "e4fa1d3e-003a-4824-ad6f-a73798830533",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:37.417197Z",
     "start_time": "2025-10-30T21:13:27.544461Z"
    }
   },
   "source": [
    "# Download validation data - this will take a few minutes\n",
    "napi.download_dataset(f\"{DATA_VERSION}/validation.parquet\")\n",
    "\n",
    "# Load the validation data and filter for data_type == \"validation\"\n",
    "validation = pd.read_parquet(\n",
    "    f\"{DATA_VERSION}/validation.parquet\",\n",
    "    columns=[\"era\", \"data_type\", \"target\"] + feature_set\n",
    ")\n",
    "validation = validation[validation[\"data_type\"] == \"validation\"]\n",
    "del validation[\"data_type\"]\n",
    "\n",
    "# Downsample to every 4th era to reduce memory usage and speedup evaluation (suggested for Colab free tier)\n",
    "# Comment out the line below to use all the data (slower and higher memory usage, but more accurate evaluation)\n",
    "validation = validation[validation[\"era\"].isin(validation[\"era\"].unique()[::4])]\n",
    "\n",
    "# Eras are 1 week apart, but targets look 20 days (o 4 weeks/eras) into the future,\n",
    "# so we need to \"embargo\" the first 4 eras following our last train era to avoid \"data leakage\"\n",
    "last_train_era = int(train[\"era\"].unique()[-1])\n",
    "eras_to_embargo = [str(era).zfill(4) for era in [last_train_era + i for i in range(4)]]\n",
    "validation = validation[~validation[\"era\"].isin(eras_to_embargo)]\n",
    "\n",
    "# Generate predictions against the out-of-sample validation features\n",
    "# This will take a few minutes 🍵\n",
    "validation[\"prediction\"] = model.predict(validation[feature_set])\n",
    "validation[[\"era\", \"prediction\", \"target\"]]"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-10-30 14:13:28,134 INFO numerapi.utils: target file already exists\n",
      "2025-10-30 14:13:28,135 INFO numerapi.utils: download complete\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "                   era  prediction  target\n",
       "id                                        \n",
       "n000c290e4364875  0579    0.494547    0.50\n",
       "n002a15bc5575bbb  0579    0.517560    0.25\n",
       "n00309caaa0f955e  0579    0.515683    0.75\n",
       "n0039cbdcf835708  0579    0.509313    0.50\n",
       "n004143458984f89  0579    0.483896    0.50\n",
       "...                ...         ...     ...\n",
       "nffc45fef92f9990  1183    0.500537    0.50\n",
       "nffcd993886ef112  1183    0.487059    0.25\n",
       "nffd2f8483ddb3cc  1183    0.512208    0.25\n",
       "nffda3e738a622a7  1183    0.492904    0.50\n",
       "nffdd2cd463ee839  1183    0.511419    0.50\n",
       "\n",
       "[942884 rows x 3 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>era</th>\n",
       "      <th>prediction</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>n000c290e4364875</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.494547</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n002a15bc5575bbb</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.517560</td>\n",
       "      <td>0.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n00309caaa0f955e</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.515683</td>\n",
       "      <td>0.75</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n0039cbdcf835708</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.509313</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n004143458984f89</th>\n",
       "      <td>0579</td>\n",
       "      <td>0.483896</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffc45fef92f9990</th>\n",
       "      <td>1183</td>\n",
       "      <td>0.500537</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffcd993886ef112</th>\n",
       "      <td>1183</td>\n",
       "      <td>0.487059</td>\n",
       "      <td>0.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffd2f8483ddb3cc</th>\n",
       "      <td>1183</td>\n",
       "      <td>0.512208</td>\n",
       "      <td>0.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffda3e738a622a7</th>\n",
       "      <td>1183</td>\n",
       "      <td>0.492904</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffdd2cd463ee839</th>\n",
       "      <td>1183</td>\n",
       "      <td>0.511419</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>942884 rows × 3 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 12
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "toGRSHN9r5Ga"
   },
   "source": [
    "### Performance evaluation\n",
    "\n",
    "Numerai calculates scores designed to \"align incentives\" between your model and the hedge fund - a model with good scores should help the hedge fund make good returns. The primary scoring metrics in Numerai are:\n",
    "\n",
    "- `CORR` (or \"Correlation\") which is calculated by the function `numerai_corr` - a Numerai specific variant of the Pearson Correlation between your model and the target.\n",
    "\n",
    "- `MMC` (or \"Meta Model Contribution\") which is a calculated by the function `correlation_contribution` - a measure of how uniquely additive your model is to the Numerai Meta Model.\n",
    "\n",
    "On the Numerai website you will see `CORR` referred to as `CORR20V2`, where the \"20\" refers to the 20-day return target and \"v2\" specifies that we are using the 2nd version of the scoring function."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "lTdo3r_Kr5Ga",
    "outputId": "85d7e416-dc88-4062-9782-4c9d82ff652a",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:38.485263Z",
     "start_time": "2025-10-30T21:13:37.417812Z"
    }
   },
   "source": [
    "# import the 2 scoring functions\n",
    "from numerai_tools.scoring import numerai_corr, correlation_contribution\n",
    "\n",
    "# Download and join in the meta_model for the validation eras\n",
    "napi.download_dataset(f\"v4.3/meta_model.parquet\", round_num=842)\n",
    "validation[\"meta_model\"] = pd.read_parquet(\n",
    "    f\"v4.3/meta_model.parquet\"\n",
    ")[\"numerai_meta_model\"]"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-10-30 14:13:38,004 INFO numerapi.utils: target file already exists\n",
      "2025-10-30 14:13:38,004 INFO numerapi.utils: download complete\n"
     ]
    }
   ],
   "execution_count": 13
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "BX49Z_Lnr5Gb"
   },
   "source": [
    "As mentioned above, it is important for us to score each historical `era` independantly. So when evaluating the performance of our model, we should be looking at the \"per era\" metrics.\n",
    "\n",
    "One thing you may notice here is how low the scores are (in the range of +/- 0.05). This is very normal in the domain of quantitative finance and is part of the reason why we say Numerai is the \"hardest data science tournament\" in the world."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 864
    },
    "id": "u_qnP9QVr5Gb",
    "outputId": "9e168f8b-4865-40b8-ad30-e84c7f7e39cf",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:39.985696Z",
     "start_time": "2025-10-30T21:13:38.486107Z"
    }
   },
   "source": [
    "# Compute the per-era corr between our predictions and the target values\n",
    "per_era_corr = validation.groupby(\"era\").apply(\n",
    "    lambda x: numerai_corr(x[[\"prediction\"]].dropna(), x[\"target\"].dropna())\n",
    ")\n",
    "\n",
    "# Compute the per-era mmc between our predictions, the meta model, and the target values\n",
    "per_era_mmc = validation.dropna().groupby(\"era\").apply(\n",
    "    lambda x: correlation_contribution(x[[\"prediction\"]], x[\"meta_model\"], x[\"target\"])\n",
    ")\n",
    "\n",
    "\n",
    "# Plot the per-era correlation\n",
    "per_era_corr.plot(\n",
    "  title=\"Validation CORR\",\n",
    "  kind=\"bar\",\n",
    "  figsize=(8, 4),\n",
    "  xticks=[],\n",
    "  legend=False,\n",
    "  snap=False\n",
    ")\n",
    "per_era_mmc.plot(\n",
    "  title=\"Validation MMC\",\n",
    "  kind=\"bar\",\n",
    "  figsize=(8, 4),\n",
    "  xticks=[],\n",
    "  legend=False,\n",
    "  snap=False\n",
    ")"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/var/folders/9t/l_bbq0y57ns1020jcy_lxsfm0000gn/T/ipykernel_82918/1642615225.py:2: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
      "  per_era_corr = validation.groupby(\"era\").apply(\n",
      "/var/folders/9t/l_bbq0y57ns1020jcy_lxsfm0000gn/T/ipykernel_82918/1642615225.py:7: FutureWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
      "  per_era_mmc = validation.dropna().groupby(\"era\").apply(\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Validation MMC'}, xlabel='era'>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ],
      "image/png": "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A0BBA9ZHHnlErrjiCpk1a5apZb3qqqtk8eLFA677yiuvmBpWDUonTZokF110kalp1eBVPfnkk3LqqafKySefLPvtt59885vfNMHtiy++mMsiAygh7W1dUu2ySzgcNRMAoDLkLIdVaz63bt0qhx9+eO9jhx12mLz//vuyY8cOmTBhQtr6q1atko985CPi9/vT1l+5cqX5/4ILLpBAINDvfdra2nJVZAAlJhKJmQlAfnz6I3uI22nvHrUGKMeAdefOneZv38BUa0TVtm3b+gWsun7mY/X19WZdNXXq1LRlmiLw9ttvm5rbkbBpTj+ALL4sfHcKTc9PnKNgFV2hqPi8TpFkoqehm5Q+zmuWl+1xNqKANRwOD5pD2tnZaf663e7ex1L/RyL9k+pDoVDauqn1B1r33XfflXnz5snnPve5foHscOrrq0a0PlCpYn1yCT0el5mQRzaRYNBrJsBqvN703+dSxXmtfIwoYNXb+GefffaAy66++mrzVwNOj8fT+7/y+Xz91td1Wlpa0h7T9b3e9JP3W2+9Jeeee67su+++csstt8hINTW1cWcDyEKg6oPvXldXVNrawuy3PGho6LmIToq0t4fJxQXyiPNaadSwZlO5OKKA9YgjjpD169cPuExrXu+44w5zq3+fffZJSxMYP358v/UnTpwoGzduTHussbExLU1gw4YNptsrDVYfeOCBfsFsNjQNh1QcIJsvS//vDvKL8xOQ7y9Z/+8cKryXAA1A99prr7S+UvV/fSwzV1VNnz5dXn/9dZNm0Hd9fVxpQ63zzjvP9BDw05/+VILBYK6KCgAAgEod6eqss84yAwfsscceZv6uu+4yQWfKrl27TCqAtv7XgQX23HNPk5uqfa0uXbpUVq9eLbfddptZ9/bbbzeDDtx6660mPzaVI6u9CgzUewAAAADKU04D1vPPP1+amprMAAAOh0M+//nPm1v6KTp/2mmnydy5c83ye++9V+bPny9z5swxNan33HOPqZHVQQWWLFlial91pKu+9LX1+QAAAKgMtqRGh2WssZFGV0A2glVeeXbtdmkIuOXI/WultZVGV/kwfnyVfPvRlXL76dMk1Bmh0RWQR5zXSqPRVW9j1EKNdAUAAADkGgErAAAALI2AFQAAAJZGwAoAAABLI2AFAACApRGwAgAAwNIIWAEAAGBpBKwAAAConJGuAJS2oyc3iNvBdSwAwFoIWAEYXeGo1Phc5v/Ozgh7BQBgGQSsAIxoNG4mAACshnt/AAAAsDQCVgAAAFgaASsAAAAsjYAVAAAAlkbACgAAAEsjYAUAAIClEbACAADA0uiHFQAAlK3PTdtLbDaROP1MlzQCVgAAUJZCnV3i8XSP4BcOR4tdHIwBASsAAChL8XiSoabLBDmsAAAAsDQCVgAAAFgaASsAAAAsjYAVAAAAlkbACgAAAEsjYAUAAIClEbACAADA0ghYAQAAYGkErAAAALA0AlYAAABYGgErAAAALI2AFQAAAJZGwAoAAABLI2AFAACApRGwAgAAwNIIWAEAAGBpBKwAAACwNAJWAAAAWBoBKwAAACyNgBUAAACWRsAKAAAASyNgBQAAgKURsAIAAKByAtZkMil33nmnHHnkkfKxj31MFixYIIlEYtD1N2/eLF/72tfk0EMPlZNOOklefvnlAddbtWqVTJkyRd57771cFhcAAACVFrA++OCD8swzz8jChQvl7rvvlqeffto8Nlhwe9lll0lDQ4M8/vjjcsopp8jll18uW7ZsSVsvGo3K9773vSEDXwAAAJSvnAasjzzyiFxxxRUya9YsU8t61VVXyeLFiwdc95VXXjE1rDfffLNMmjRJLrroIlPTqsFrXw888IAEg8FcFhMAAACVGLBu375dtm7dKocffnjvY4cddpi8//77smPHjgFv83/kIx8Rv9+ftv7KlSt759966y0T8H73u9/NVTEBAABQYpy5eqGdO3eavxMmTOh9TG/3q23btqU9nlo/87H6+nqzbipl4Prrr5e5c+eax0fLZhv1UwEgr/T8xDkKQCWz2fIQsIbDYVOTOpDOzk7z1+129z6W+j8SifRbPxQKpa2bWj+17m9+8xuTv3rmmWeaWtrRqq+vGvVzASBvbCLBoNdMAIAcBqx6G//ss88ecNnVV19t/mrA6fF4ev9XPp+v3/q6TktLS9pjur7X6zW1rz/84Q/loYceEtsYqx+amtokmRzTSwBAzjQ09FxEJ0Xa28MSDkfZuwAqls2WXeXiiALWI444QtavXz/gMq15veOOO0ywuc8++6SlCYwfP77f+hMnTpSNGzemPdbY2GjSBLR7q+bmZvnCF77Qmx6gPvvZz8rFF19spmzpUwlYAVgR5ycAKHAOqwage+21lyxbtqw3YNX/9bHMXFU1ffp0uf/++02agdaqptbXhlezZ8+WmTNnpgXDX/3qV836H/7wh3NVZAAoiskTgmIneRUACh+wqrPOOssMHLDHHnuY+bvuukvOO++83uW7du0yqQCBQMAMLLDnnnvKvHnz5NJLL5WlS5fK6tWr5bbbbjPdWPXtysrhcJi/GvzW1NTkssgAUFDhSEwu+cRkc+coHqd/aQAoeMB6/vnnS1NTkxkAQIPMz3/+82YkqxSdP+2000zLf11+7733yvz582XOnDmy3377yT333GOCUgAoV+2tIenoqV1NJEiwB4Bs2JKpBNEy1dhIoysAAAAr0uv33saohRrpCgAAAMg1AlYAAABYGgErAAAALI2AFQAAAJZGwAoAAABLI2AFAACApRGwAgAAwNIIWAEAAGBpBKwAAACwNAJWAAAAWJpTylzPkN0AAAAo0TjNlkwmk/kuDAAAADBapAQAAADA0ghYAQAAYGkErAAAALA0AlYAAABYGgErAAAALI2AFQAAAJZGwAoAAABLI2AFAACApRGwAgAAwNIIWAHAIrZu3SoXX3yxTJ8+XY477jhZuHChxONxeeKJJ+SLX/yiXHbZZXLYYYfJ7373O2lvb5d58+bJxz/+cfnoRz8qJ5xwgixZsqTYmwAAeeHMz8sCAEZCR8m+/PLL5eCDD5Ynn3xSdu7cKddff73YbDbZc889ZcWKFSaYvfLKK6W2tlZuvfVWeeutt2TRokXi8/nkgQcekPnz58sxxxwjbrebnQ+grFDDCgAW8Morr8iWLVvk+9//vhx44IFyxBFHyHe+8x155JFHzHINXC+55BKZNGmS1NXVyeGHHy4333yzTJkyRfbff38577zzpKWlRZqamoq9KQCQc9SwAoAFbNq0yQScess/JZFISDgcNo/X19eL1+vtXXbqqaeaFIBHH31U3nzzTXn99dfN45pCAADlhoAVACwgFouZmtV7772337LXXntNPB5P2mPXXHONSRM45ZRT5KyzzpLx48fLF77whQKWGAAKh4AVACzggAMOMCkBeru/qqrKPPaXv/zFNLg68sgj09bVBlfPPPOMqV2dNm2aeezFF1/szYUFgHJDDisAWMDRRx8te++9t1x99dWyfv16+fvf/y7XXXedaVDlcDjS1tVGVfr4Cy+8IO+995689NJLJp9VRSKRIm0BAOQPASsAWIAGpT/5yU9M3uqZZ54pc+fOlWOPPVa+973v9VtXA9Y77rhD/vCHP8hnPvMZ+cEPfmAaZGlawD//+c+ilB8A8smW5P4RAAAALIwaVgAAAFgaASsAAAAsjYAVAAAAlkbACgAAAEsjYAUAAIClEbACAADA0ghYAQAAYGkErAAAALA0AlYAAABYGgErAAAALI2AFQAAAGJl/x8/Gg/T7SS8lAAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ],
      "image/png": "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L6+W7D5CAACyj80mUtTeJy6HPa5cxZaDB/0SCkXStm8w930uLS08Yj1aWAEAgOWoxqaqyjqxqUTTRDRKS1SuIbACAADLhtYsvxCMFHHTFQAAACyNwAoAAABLI7ACAADA0gisAAAAsDQCKwAAACyNwAoAAABLI7ACAADA0gisAAAAsDQCKwAAACyNwAoAAABLy/qpWZNMQQwAAIAMymm2BibpBQAAgIXRJQAAAACWRmAFAACApRFYAQAAYGkEVgAAAFgagRUAAACWRmAFAACApRFYAQAAYGkEVgAAAFgagRUAAACWRmAFAIvYu3ev3HTTTdK3b1+56KKLZMGCBRKJRGTFihXygx/8QCZNmiQDBw6UF198UWpqamT69Oly3nnnyVlnnSXDhw+XtWvXpvsQAKBVOFrnZQEALaFmyZ48ebKcccYZsnLlStm3b5/MmjVLbDabdO7cWTZu3KjD7M9//nPp0KGDzJs3Tz766CNZunSpeL1eWbJkicycOVOGDh0qLpeLkw8gq9DCCgAWsG7dOvn888/l7rvvllNOOUXOOecc+eUvfylPPfWUXq+C68033yzdu3eX4uJiGTx4sNx1113Ss2dPOemkk2T8+PFSWVkpFRUV6T4UADAdLawAYAEffPCBDpzqkn9MNBqVQCCgy0tKSsTj8RjrRo4cqbsAPPfcc/Lhhx/Ktm3bdLnqQgAA2YbACgAWEA6HdcvqI488krDu3XffFbfbHVc2bdo03U3gqquukmuvvVY6duwo3//+99twjwGg7RBYAcACTj75ZN0lQF3uLyws1GVvvfWWvuHq3HPPjaurbrhatWqVbl3t06ePLnv99deNvrAAkG3owwoAFjBkyBA5/vjjZerUqbJz505577335M4779Q3VNnt9ri66qYqVf7qq6/Kp59+Kv/85z91f1YlGAym6QgAoPUQWAHAAlQoffTRR3W/1e9973syZcoU+fa3vy133HFHQl0VWO+//3555ZVX5Dvf+Y7ce++9+oYs1S3g3//+d1r2HwBak62B60cAAACwMFpYAQAAYGkEVgAAAFgagRUAAACWRmAFAACApRFYAQAAYGkEVgAAAFgagRUAAACWRmAFAACApRFYAQAAYGkEVgAAAFgagRUAAABiZf8fm4D63gVkdv0AAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 14
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "bAMEtbTFr5Gb"
   },
   "source": [
    "Instead of looking at the raw score for each era, it is helpful to look at the cumulative scores.\n",
    "\n",
    "If you are familiar with \"backtesting\" in quant finance where people simulate the historical performance of their investment strategies, you can roughly think of this plot as a backtest of your model performance over the historical validation period.\n",
    "\n",
    "Notice a few things below:\n",
    "\n",
    "- CORR gradually increases over many eras of the validation data even with this simple model on modern data.\n",
    "\n",
    "- MMC is generated over a smaller set of recent eras - this is because the validation time range pre-dates the Meta Model.\n",
    "\n",
    "- MMC is very high early on in the Meta Model's existence, MMC - this is because the newest datasets were not available and models trained on the newest data are could have been very additive in the past.\n",
    "\n",
    "- MMC is flat and decreasing recently because the Meta Model has started catching up to modern data sets and getting correlation has been difficult in recent eras."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 821
    },
    "id": "T62k0nGpr5Gb",
    "outputId": "1c0db1d3-f518-4c7c-93b2-2e352c13e53d",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:40.075819Z",
     "start_time": "2025-10-30T21:13:39.986669Z"
    }
   },
   "source": [
    "# Plot the cumulative per-era correlation\n",
    "per_era_corr.cumsum().plot(\n",
    "  title=\"Cumulative Validation CORR\",\n",
    "  kind=\"line\",\n",
    "  figsize=(8, 4),\n",
    "  legend=False\n",
    ")\n",
    "per_era_mmc.cumsum().plot(\n",
    "  title=\"Cumulative Validation MMC\",\n",
    "  kind=\"line\",\n",
    "  figsize=(8, 4),\n",
    "  legend=False\n",
    ")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Cumulative Validation MMC'}, xlabel='era'>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ],
      "image/png": "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Lk5uuukm6dy5s9x4442ybt26Mrf9v//7P+nXr5906tRJ/vGPf8iePXvKfYwnnnhC3nzzTbs/F09qf93vW7dufdrprbfeKnP/7P/nlpubK4MGDZI///yz5LL9+/fLnXfead57rrzySvn111/Lve28efPkjjvuKPdv7Pf2a/9rrrnmtH1/+/btZa7Dvm+ftv/666/l8ssvly5dusj9998viYmJ7P9uyi1D59SpU82H64wZM+Tpp582H5rff/+9JCcnyz333GN2+vnz58sVV1wh9913nxw+fNjc7vPPPzfXffTRR+V///ufHDlyRP75z3+Wue/CwkJ59tln5bfffnPQs3Pt9tc3nlatWsmXX35pXoe77rpLEhISSj5s3377bZk8ebJ88803Urt2bfN6nXqk1vfff19mz57toGfnvu2vl+mHgeX05JNPSkhIiFx77bUl983+X7HQr+8h8fHxJZfpPqwfppGRkTJnzhzzhfeBBx4oaXuLFStWyFNPPVXu/bLf26/9CwoKzBfcTz75pMz/QLNmzdj37dz2y5cvN1+S9YuWvq8HBQXJqFGjzHsN+7/78RE3k5mZaXZcfYOOjY01J/0HmDVrlnh7e5vTyJEjzXU10GjPmvb2DBw40Lzh6IewfktTL7zwglx00UWya9cu8+ajIfRf//qXHDhwQEJDQx38TF2v/Q8ePGiC5KRJk8zr0Lx5c/PGrgFfw316erqMHTtW+vbta+5L33j0DerYsWMSEREhJ06cMG9O+sFcv359Rz9Vt2v/8PDwkvvR10K/AIwbN04aNmxoLmP/P7cdO3aYtjz1i5Lus9rb89lnn5kPVW37P/74w3wIjxkzxlxHvxy8++67EhMTU+a27Pf2b399T8/Ly5OOHTuKv7//affLvm+/ttfP3auvvlpuv/12c/1nnnnGfAZox86FF17I/u9m3K6nc+vWrZKfn2+GDy26du0q69evNx+4qamp8sMPP5h/jMWLF5vhc+35UfqPocO6FnXr1jUfxJYhyE2bNpmwo/8s2gME69pf21dDkAYeCx3CsrTvbbfdZoZ+LaHn008/lZYtW5aEIf1g0G/SOq2hcePGNL+N2780nWZSp04due6660ouY/8/t5UrV0qPHj3MqElp2v7t2rUzH7qlX5fSba8fstruAwYMKHNb9nv7t78GJn1vLy9wKvZ9+7W9vi9p2LcI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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VtW4n1jpr5Gc"
   },
   "source": [
    "### Performance metrics\n",
    "\n",
    "To evaluate the performance of our model, it is also helpful to compute some summary metrics over the entire validation period:\n",
    "\n",
    "- `Mean` is the primary measure of your model's long-term performance.\n",
    "\n",
    "- `Sharpe` is a measure of your model's consistency. In finance, the Sharpe ratio of an investment strategy measures risk adjusted returns. In Numerai, we compute sharpe as the mean divided by the standard deviation.\n",
    "\n",
    "- `Max drawdown` is a measure of your model's risk. In finance, the max drawdown of an investment strategy is the largest loss suffered. In Numerai, we compute max drawdown as the maximum peak to trough drop in a cumulative score."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 175
    },
    "id": "0EXHy3M0r5Gc",
    "outputId": "d152681f-bd4e-40fe-c7c2-b8ab1572760f",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:40.083670Z",
     "start_time": "2025-10-30T21:13:40.076597Z"
    }
   },
   "source": [
    "# Compute performance metrics\n",
    "corr_mean = per_era_corr.mean()\n",
    "corr_std = per_era_corr.std(ddof=0)\n",
    "corr_sharpe = corr_mean / corr_std\n",
    "corr_max_drawdown = (per_era_corr.cumsum().expanding(min_periods=1).max() - per_era_corr.cumsum()).max()\n",
    "\n",
    "mmc_mean = per_era_mmc.mean()\n",
    "mmc_std = per_era_mmc.std(ddof=0)\n",
    "mmc_sharpe = mmc_mean / mmc_std\n",
    "mmc_max_drawdown = (per_era_mmc.cumsum().expanding(min_periods=1).max() - per_era_mmc.cumsum()).max()\n",
    "\n",
    "pd.DataFrame({\n",
    "    \"mean\": [corr_mean, mmc_mean],\n",
    "    \"std\": [corr_std, mmc_std],\n",
    "    \"sharpe\": [corr_sharpe, mmc_sharpe],\n",
    "    \"max_drawdown\": [corr_max_drawdown, mmc_max_drawdown]\n",
    "}, index=[\"CORR\", \"MMC\"]).T"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "                                               CORR  \\\n",
       "mean          prediction    0.016923\n",
       "dtype: float64   \n",
       "std           prediction    0.018835\n",
       "dtype: float64   \n",
       "sharpe        prediction    0.898501\n",
       "dtype: float64   \n",
       "max_drawdown  prediction    0.041581\n",
       "dtype: float64   \n",
       "\n",
       "                                                MMC  \n",
       "mean          prediction    0.006881\n",
       "dtype: float64  \n",
       "std           prediction    0.016548\n",
       "dtype: float64  \n",
       "sharpe        prediction    0.415804\n",
       "dtype: float64  \n",
       "max_drawdown  prediction    0.067466\n",
       "dtype: float64  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CORR</th>\n",
       "      <th>MMC</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>prediction    0.016923\n",
       "dtype: float64</td>\n",
       "      <td>prediction    0.006881\n",
       "dtype: float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>prediction    0.018835\n",
       "dtype: float64</td>\n",
       "      <td>prediction    0.016548\n",
       "dtype: float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sharpe</th>\n",
       "      <td>prediction    0.898501\n",
       "dtype: float64</td>\n",
       "      <td>prediction    0.415804\n",
       "dtype: float64</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max_drawdown</th>\n",
       "      <td>prediction    0.041581\n",
       "dtype: float64</td>\n",
       "      <td>prediction    0.067466\n",
       "dtype: float64</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "7k973wHgr5Gc"
   },
   "source": [
    "These performance metrics above are not amazing but that's ok, we are just getting started. In the next few tutorials, you will learn how to improve our model performance."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "5gC06mZ-r5Gc"
   },
   "source": [
    "## 3. Submissions\n",
    "\n",
    "Unlike Kaggle competitions that evalute models based on <ins>test</ins> performance, Numerai evaluates models based based on <ins>live</ins> performance.\n",
    "\n",
    "### Live predictions\n",
    "\n",
    "Every Tuesday-Saturday, new `live features` are released, which represent the current state of the stock market.\n",
    "\n",
    "Your task is to generate `live predictions` on the unknown target values, which represent stock market returns 20 days into the future."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 473
    },
    "id": "yUEWmrdnr5Gc",
    "outputId": "2621bd44-8ae2-4ea2-caa9-6bc719697661",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:40.738515Z",
     "start_time": "2025-10-30T21:13:40.089389Z"
    }
   },
   "source": [
    "# Download latest live features\n",
    "napi.download_dataset(f\"{DATA_VERSION}/live.parquet\")\n",
    "\n",
    "# Load live features\n",
    "live_features = pd.read_parquet(f\"{DATA_VERSION}/live.parquet\", columns=feature_set)\n",
    "\n",
    "# Generate live predictions\n",
    "live_predictions = model.predict(live_features[feature_set])\n",
    "\n",
    "# Format submission\n",
    "pd.Series(live_predictions, index=live_features.index).to_frame(\"prediction\")"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-10-30 14:13:40,613 INFO numerapi.utils: target file already exists\n",
      "2025-10-30 14:13:40,614 INFO numerapi.utils: download complete\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "                  prediction\n",
       "id                          \n",
       "n000216cc4494713    0.505099\n",
       "n000a84b4f40eca0    0.510841\n",
       "n0011889f1d1f315    0.483067\n",
       "n0020dbf0bd45ef4    0.483435\n",
       "n002f65628075a89    0.495300\n",
       "...                      ...\n",
       "nffcea5e1ee074fc    0.506101\n",
       "nffeb4bd146a7d3f    0.497980\n",
       "nfffa1a1e897fb6f    0.501490\n",
       "nfffecb08bf96924    0.505730\n",
       "nffffb5d0acb74c0    0.517923\n",
       "\n",
       "[6854 rows x 1 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>prediction</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>id</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>n000216cc4494713</th>\n",
       "      <td>0.505099</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n000a84b4f40eca0</th>\n",
       "      <td>0.510841</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n0011889f1d1f315</th>\n",
       "      <td>0.483067</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n0020dbf0bd45ef4</th>\n",
       "      <td>0.483435</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>n002f65628075a89</th>\n",
       "      <td>0.495300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffcea5e1ee074fc</th>\n",
       "      <td>0.506101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffeb4bd146a7d3f</th>\n",
       "      <td>0.497980</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfffa1a1e897fb6f</th>\n",
       "      <td>0.501490</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nfffecb08bf96924</th>\n",
       "      <td>0.505730</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>nffffb5d0acb74c0</th>\n",
       "      <td>0.517923</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>6854 rows × 1 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JAsl2z7mr5Gd"
   },
   "source": [
    "### Model upload\n",
    "\n",
    "To participate in the tournament, you must submit live predictions every Tuesday-Saturday.\n",
    "\n",
    "To automate this process, you can simply:\n",
    "- Define your prediction pipeline as a function\n",
    "- Serialize your function using the `cloudpickle` library\n",
    "- Upload your model pickle file to Numerai\n",
    "- Let Numerai run your model to submit live predictions every day\n",
    "\n",
    "Read more about Model Uploads and other self-hosted automation options in our [docs](https://docs.numer.ai/numerai-tournament/submissions#automation).\n"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "U4bHP_BGr5Gd",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:40.741709Z",
     "start_time": "2025-10-30T21:13:40.739515Z"
    }
   },
   "source": [
    "# Define your prediction pipeline as a function\n",
    "def predict(live_features: pd.DataFrame, _live_benchmark_models: pd.DataFrame) -> pd.DataFrame:\n",
    "    live_predictions = model.predict(live_features[feature_set])\n",
    "    submission = pd.Series(live_predictions, index=live_features.index)\n",
    "    return submission.to_frame(\"prediction\")"
   ],
   "outputs": [],
   "execution_count": 18
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "l442TN44r5Gd",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:40.780710Z",
     "start_time": "2025-10-30T21:13:40.742547Z"
    }
   },
   "source": [
    "# Use the cloudpickle library to serialize your function\n",
    "import cloudpickle\n",
    "p = cloudpickle.dumps(predict)\n",
    "with open(\"hello_numerai.pkl\", \"wb\") as f:\n",
    "    f.write(p)"
   ],
   "outputs": [],
   "execution_count": 19
  },
  {
   "cell_type": "code",
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 17
    },
    "id": "IFUq_XpDr5Gd",
    "outputId": "393d8652-639c-433e-b48c-f4bcc605726f",
    "ExecuteTime": {
     "end_time": "2025-10-30T21:13:40.783911Z",
     "start_time": "2025-10-30T21:13:40.781471Z"
    }
   },
   "source": [
    "# Download file if running in Google Colab\n",
    "try:\n",
    "    from google.colab import files\n",
    "    files.download('hello_numerai.pkl')\n",
    "except:\n",
    "    pass"
   ],
   "outputs": [],
   "execution_count": 20
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "iplRaPPLr5Gd"
   },
   "source": [
    "That's it! You now have a pickle file that is ready for upload.\n",
    "\n",
    "Head back to the [Hello Numerai Tutorial](https://numer.ai/tutorial/hello-numerai) to upload your model!"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "3.11.13",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
